#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <termios.h>
#include <sys/ioctl.h>

#define UART_DEVICE "/dev/ttyS4"

int main()
{
    system("/userfs/422.sh");

    int fd, ret, fd2;
    char *max485_ctl = "/dev/ttyS4";
    struct termios old_cfg = {0}; //用于保存终端配置之前的参数
    struct termios new_cfg = {0}; //用于保存终端新配置的参数
    speed_t speed = B115200;      //定义波特率为115200

    /*第一步，串口初始化*/
    fd = open(UART_DEVICE, O_RDWR | O_NOCTTY | O_NDELAY); //O_NOCTTY 标志，告知系统该节点不会成为进程的控制终端
    if (fd < 0)
    {
        printf("uart device open error\n");
        return -1;
    }

    /*打开485控制设备*/
    fd2 = open(max485_ctl, O_RDWR | O_NOCTTY | O_NDELAY);
    if (fd2 < 0)
    {
        printf("Open max485_ctl failed\n");
        return -1;
    }

    ret = tcgetattr(fd, &old_cfg);
    if (ret < 0)
    {
        printf("tcgetattr error\n");
        close(fd);
        return -1;
    }

    /*第二步，配置串口参数*/
    cfmakeraw(&new_cfg);        //设置为原始模式
    new_cfg.c_cflag |= CREAD;   // 使能接收
    cfsetspeed(&new_cfg, speed);//将波特率设置为115200
    new_cfg.c_cflag &= ~CSIZE;  //将数据位相关的比特位清零
    new_cfg.c_cflag |= CS8;     //将数据位数设置为8位
    new_cfg.c_cflag &= ~PARENB;
    new_cfg.c_iflag &= ~INPCK;  //设置为无校验模式
    new_cfg.c_cflag &= ~CSTOPB; //将停止位设置为1位
    new_cfg.c_cc[VTIME] = 0;    // 将 MIN 和 TIME 设置为 0
    new_cfg.c_cc[VMIN] = 0;
    ret = tcflush(fd, TCIOFLUSH); //清空缓冲区域
    if (ret < 0)
    {
        printf("tcflush error\n");
        return -1;
    }
    ret = tcsetattr(fd, TCSANOW, &new_cfg); //写入配置、使配置生效
    if (ret < 0)
    {
        printf("tcsetattr error\n");
        return -1;
    }

    char buff[100];
    while (1)
    {
        ret = read(fd, buff, sizeof(buff) - 1);
        buff[ret] = 0;
        if (ret < 0)
        {
            printf("read failed\n");
        }
        else if (ret > 0)
        {
            printf("Received message: %s\n", buff);

            // 回复相同的消息
            write(fd, buff, strlen(buff));
            printf("422 测试成功\n");
            system("echo \"$(date)：422 测试成功\" >> /userfs/all.txt");
        }
        sleep(1);
    }

    tcsetattr(fd, TCSANOW, &old_cfg); //恢复到之前的配置
    close(fd);
    return 0;
}


// #include <stdio.h>
// #include <sys/types.h>
// #include <sys/stat.h>
// #include <fcntl.h>
// #include <unistd.h>
// #include <string.h>
// #include <termios.h>
// #include <sys/ioctl.h>

// #define UART_DEVICE "/dev/ttyS4"

// int main()
// {
//     // 调用shell脚本以进行初始化
//     system("/userfs/422.sh");

//     int fd, ret;
//     char *max485_ctl = "/dev/ttyS4";
//     struct termios old_cfg = {0}; // 用于保存终端配置之前的参数
//     struct termios new_cfg = {0}; // 用于保存终端新配置的参数
//     speed_t speed = B115200;      // 定义波特率为115200

//     // 第一步，串口初始化
//     fd = open(UART_DEVICE, O_RDWR | O_NOCTTY | O_NDELAY); // O_NOCTTY 标志，告知系统该节点不会成为进程的控制终端
//     if (fd < 0)
//     {
//         printf("uart device open error\n");
//         return -1;
//     }

//     // 打开485控制设备
//     int fd2 = open(max485_ctl, O_RDWR | O_NOCTTY | O_NDELAY);
//     if (fd2 < 0)
//     {
//         printf("Open max485_ctl failed\n");
//         return -1;
//     }

//     ret = tcgetattr(fd, &old_cfg);
//     if (ret < 0)
//     {
//         printf("tcgetattr error\n");
//         close(fd);
//         return -1;
//     }

//     // 第二步，配置串口参数
//     cfmakeraw(&new_cfg);        // 设置为原始模式
//     new_cfg.c_cflag |= CREAD;   // 使能接收
//     cfsetspeed(&new_cfg, speed); // 将波特率设置为115200
//     new_cfg.c_cflag &= ~CSIZE;  // 将数据位相关的比特位清零
//     new_cfg.c_cflag |= CS8;     // 将数据位数设置为8位
//     new_cfg.c_cflag &= ~PARENB; // 无校验
//     new_cfg.c_iflag &= ~INPCK;  // 无校验模式
//     new_cfg.c_cflag &= ~CSTOPB; // 停止位设置为1位
//     new_cfg.c_cc[VTIME] = 0;    // MIN 和 TIME 设置为 0
//     new_cfg.c_cc[VMIN] = 0;

//     ret = tcflush(fd, TCIOFLUSH); // 清空缓冲区域
//     if (ret < 0)
//     {
//         printf("tcflush error\n");
//         return -1;
//     }
//     ret = tcsetattr(fd, TCSANOW, &new_cfg); // 写入配置、使配置生效
//     if (ret < 0)
//     {
//         printf("tcsetattr error\n");
//         return -1;
//     }

//     char buff[100];
//     while (1)
//     {
//         ret = read(fd, buff, sizeof(buff) - 1);
//         if (ret < 0)
//         {
//             printf("read failed\n");
//         }
//         else if (ret > 0)
//         {
//             buff[ret] = '\0'; // 确保字符串以NULL结尾
//             printf("Received message: %s\n", buff);

//             // 回复相同的消息
//             write(fd, buff, strlen(buff));
//             printf("Sent message: %s\n", buff);

//             // 检查发送的消息和接收的消息是否相同
//             if (strcmp(buff, buff) == 0)   // 此处我们要保存发送的内容以便比较
//             {
//                 printf("422 测试成功\n");
//                 system("echo \"$(date) 422 测试成功\" >> /userfs/all.txt");
//             }
//         }
//         sleep(1);
//     }

//     tcsetattr(fd, TCSANOW, &old_cfg); // 恢复到之前的配置
//     close(fd);
//     return 0;
// }

